package com.ikingtech.framework.sdk.post.api;

import com.ikingtech.framework.sdk.base.model.BatchParam;
import com.ikingtech.framework.sdk.base.model.DragOrderParam;
import com.ikingtech.framework.sdk.core.response.R;
import com.ikingtech.framework.sdk.post.model.PostDTO;
import com.ikingtech.framework.sdk.post.model.PostQueryParamDTO;
import com.ikingtech.framework.sdk.web.annotation.PostRequest;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.Map;

/**
 * @author tie yan
 */
public interface PostApi {


    /**
     * 新增<br />
     * 新增成功后返回编号
     *
     * @param post 岗位信息
     * @return 编号
     */
    @PostRequest(order = 1, value = "/add", summary = "新增", description = "新增，新增成功后返回编号。")
    R<String> add(@Parameter(name = "post", description = "岗位信息")
                  @Validated @RequestBody PostDTO post);

    /**
     * 删除
     *
     * @param id 编号
     * @return 执行结果
     */
    @PostRequest(order = 2, value = "/delete", summary = "删除", description = "删除。")
    R<Object> delete(@Parameter(name = "id", description = "编号")
                     @RequestBody String id);

    /**
     * 更新
     *
     * @param post 岗位信息
     * @return 执行结果
     */
    @PostRequest(order = 3, value = "/update", summary = "更新", description = "更新。")
    R<Object> update(@Parameter(name = "post", description = "岗位信息")
                     @RequestBody PostDTO post);

    /**
     * 分页查询<br />
     * 没有查询结果时返回空列表
     *
     * @param queryParam 查询条件
     * @return 全量列表
     */
    @PostRequest(order = 4, value = "/list/page", summary = "分页查询", description = "分页查询，没有查询结果时返回空列表。")
    R<List<PostDTO>> page(@Parameter(name = "queryParam", description = "查询条件")
                          @RequestBody PostQueryParamDTO queryParam);

    /**
     * 全量查询<br />
     * 没有查询结果时返回空列表
     *
     * @return 全量列表
     */
    @PostRequest(order = 5, value = "/list/all", summary = "全量查询", description = "全量查询，没有查询结果时返回空列表。")
    R<List<PostDTO>> all();

    /**
     * 查询详情<br />
     * 数据不存在时仍然返回成功,数据为null
     *
     * @param id 编号
     * @return 详情
     */
    @PostRequest(order = 6, value = "/detail/id", summary = "查询详情", description = "查询详情，数据不存在时仍然返回成功,数据为null。")
    R<PostDTO> detail(@Parameter(name = "id", description = "编号")
                      @RequestBody String id);

    /**
     * 查询岗位Map(多岗位编号)p<br />
     * key为岗位编号，value为岗位<br />
     * 没有查询结果时返回空Map
     *
     * @param ids 编号集合
     * @return 岗位Map(多岗位编号)
     */
    @PostRequest(order = 7, value = "/map/ids", summary = "查询岗位Map(多岗位编号)", description = "查询岗位Map(多岗位编号)，key为岗位编号，value为岗位，没有查询结果时返回空Map。")
    R<Map<String, PostDTO>> mapByIds(@Parameter(name = "ids", description = "编号集合")
                                     @RequestBody BatchParam<String> ids);

    /**
     * 拖拽排序
     *
     * @param dragParam 拖拽参数
     * @return 拖拽结果
     */
    @PostRequest(order = 8, value = "/drag", summary = "拖拽排序", description = "拖拽排序，调用拖拽排序接口后需再次调用列表查询接口展示最新排序结果。")
    R<Object> drag(@Parameter(name = "dragParam", description = "拖拽参数。")
                   @RequestBody DragOrderParam dragParam);

    @PostMapping("/list/name")
    R<List<PostDTO>> listByName(String name);
}
